04类中的`__init__`方法有什么作用,为什么叫构造方法?
文章目录
问题: 类中的__init__方法有什么作用,为什么叫构造方法?
👇 点击展开/折叠 面试背诵模板(建议先背这个)
名称辨析:为什么__init__会被误称为“构造方法”
在多数面向对象语言(如 Java、C++)中,构造方法(Constructor)负责分配内存和初始化数据。Python 将此两步分离:__new__ 负责分配内存,__init__ 负责初始化。由于开发者极少重写 __new__,日常编程中 __init__ 承担了构造方法的大部分视觉职责(写属性、设默认值),因此业界习惯将其称为“构造方法”或“构造函数”。
__new__ 与 __init__ 的核心职责对比
| 维度 | __new__ |
__init__ |
|---|---|---|
| 本质角色 | 真正的构造器 | 初始化器 |
| 第一参数 | cls(类本身) |
self(已分配的实例) |
| 主要职责 | 分配内存,返回空实例 | 填充数据,绑定属性 |
| 返回值 | 必须返回实例(instance) |
必须返回 None |
| 执行时机 | 先执行 | 后执行 |
| 重写频率 | 极少(单例、不可变类型如 int 子类化) |
几乎每次定义类都会重写 |
1 | class Demo: |
实现细节:实例化时的参数传递机制
当调用 Student("张三", 18) 时,Python 解释器执行以下等价逻辑:
1 | # 伪代码揭示底层调用顺序 |
日常开发中的核心作用(功能层面)
- 强制绑定实例属性:确保每个对象创建后都具备必要属性(如
self.name),避免后续访问AttributeError。 - 合法性校验:在属性赋值前进行边界检查(如年龄不能为负),保证对象的不变性(Invariant)。
- 关联外部资源:建立数据库连接、打开文件句柄或注册回调等,让对象一出厂就处于“可用状态”。
常见陷阱与注意事项
- 返回值限制:若在
__init__中return非None的值,会抛出TypeError。它本质是变更函数,不是工厂函数。 - 默认参数突变:避免使用
def __init__(self, items=[]),因为空列表在定义时创建,所有实例共享同一列表。正确做法为items=None。 - 必须调用父类初始化:若子类重写了
__init__,需要显式调用super().__init__(),否则父类属性不会被绑定,导致对象缺少父类定义的特征。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 LGQ的博客!